VisualHMI - 寄存器操作
本章节以DCBUS为例,介绍寄存器的读写API使用。HMI数据类型包括bit、int16/uint16、int32/uint32、int64/uint64、float、double、string,批量写短整型等
1. get_bit/ set_bit
1.1. API说明
- get_bit(vtype, addr)
获取位寄存器:如Modbus的线圈、Fx2N的X、Y、S、M寄存器
- vtype:数据类型
addr:变量地址
set_bit(vtype, addr,value)
设置位寄存器:如Modbus的线圈、Fx2N的X、Y、S、M寄存器
- vtype:数据类型
- addr:变量地址
- value: 1或0
[!note|tip:注意] 在Modbus 协议中,若是LW/RW/4x/3x寄存器,调用set_bit/get_bit,读写的都是bit0位
适用范围:VisualHMI - HMI&M系列
例程下载链接:ViusalHMI - 寄存器读写(点击下载)
其他参考链接:ViusalHMI - 一主多从(点击跳转)
1.2.LUA脚本
点击线圈0x0000位状态指示灯,触发on_update回调,读取线圈0x0000,并设置线圈0x0001。
function on_update(slave,vtype,addr)
if vtype == VT_0x
then
if addr == 0x0000
then
set_bit(VT_0x, 0x0001, get_bit(VT_0x, 0x0000))
end
end
end
1.3.运行预览
运行虚拟屏,点击线圈0x0000,线圈0x0001实时变化,如下所示:
2. get_uint16/set_uint16
2.1. API说明
- get_uint16(vtype, addr)
读取无符号短整形寄存器,返回无符号短整形数据
vtype:数据类型
addr:变量地址
set_bit(vtype, addr,value)
设置无符号短整形寄存器值
- vtype:数据类型
- addr:变量地址
- value: 寄存器值
2.2.LUA脚本
点击数值控件0x1000(LW 内存变量),触发on_update回调,读取内存变量0x1000,并设置内存变量0x1001。
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1000
then
set_uint16(vtype, addr+1, get_uint16(vtype, addr))
end
end
end
2.3.运行预览
运行虚拟屏,点击寄存器0x1000(LW 内存变量)数值,弹出键盘输入100,寄存器0x1001(LW 内存变量)实时变化,如下所示:
3. get_int16/set_int16
3.1. API说明
- get_int16(vtype, addr)
读取有符号短整形寄存器,返回有符号短整形数据
vtype:数据类型
addr:变量地址
set_int16(vtype, addr,value)
设置有符号短整形寄存器值
- vtype:数据类型
- addr:变量地址
- value: 寄存器值
3.2.LUA脚本
点击数值控件0x1002(LW 内存变量),触发on_update回调,读取内存变量0x1002,并设置内存变量0x1003。
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1002
then
set_int16(vtype, addr+1, get_int16(vtype, addr))
end
end
end
3.3.运行预览
运行虚拟屏,点击寄存器0x1002(LW 内存变量)数值,弹出键盘输入-100,寄存器0x1003(LW 内存变量)实时变化,如下所示:
4. get_uint32/set_uint32
4.1. API说明
- get_uint32(vtype, addr)
读取无符号整形寄存器,返回无符号整形数据
vtype:数据类型
addr:变量地址
set_uint32(vtype, addr,value)
设置无符号整形寄存器值
- vtype:数据类型
- addr:变量地址
- value: 寄存器值
4.2.LUA脚本
点击数值控件0x1004(LW 内存变量),触发on_update回调,读取内存变量0x1004,并设置内存变量0x1006
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1004
then
set_uint32(vtype, addr+2, get_uint32(vtype, addr))
end
end
end
4.3.运行预览
运行虚拟屏,点击寄存器0x1004(LW 内存变量)数值,弹出键盘输入70000,寄存器0x1006(LW 内存变量)实时变化,如下所示:
5. get_int32/set_int32
5.1. API说明
- get_int32(vtype, addr)
读取有符号整形寄存器,返回有符号整形数据
vtype:数据类型
addr:变量地址
set_int32(vtype, addr,value)
设置有符号整形寄存器值
- vtype:数据类型
- addr:变量地址
- value: 1或0
5.2.LUA脚本
点击数值控件0x1008(LW 内存变量),触发on_update回调,读取内存变量0x1008,并设置内存变量0x100A
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1008
then
set_int32(vtype, addr+2, get_int32(vtype, addr))
end
end
end
5.3.运行预览
运行虚拟屏,点击寄存器0x1008(LW 内存变量)数值,弹出键盘输入-70000,寄存器0x100A(LW 内存变量)实时变化,如下所示:
6. set_uint64/get_uint64
6.1. API说明
- get_uint64(vtype, addr)
读取无符号长整形寄存器,返回无符号长整形数据
vtype:数据类型
addr:变量地址
set_uint64(vtype, addr,value)
设置无符号长整形寄存器值
- vtype:数据类型
- addr:变量地址
- value: 1或0
6.2.LUA脚本
点击数值控件0x100C(LW 内存变量),触发on_update回调,读取内存变量0x100C,并设置内存变量0x1010
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1000
then
set_uint64(vtype, addr+4, get_uint64(vtype, addr))
end
end
end
7. set_int64/get_int64
7.1. API说明
- get_int64(vtype, addr)
读取有符号长整形寄存器,返回有符号长整形数据
vtype:数据类型
addr:变量地址
set_int64(vtype, addr,value)
设置有符号长整形寄存器值
- vtype:数据类型
- addr:变量地址
- value: 1或0
7.2.LUA脚本
点击数值控件0x1014(LW 内存变量),触发on_update回调,读取内存变量0x1014,并设置内存变量0x1018
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1014
then
set_int64(vtype, addr+4, get_int64(vtype, addr))
end
end
end
8. get_float/set_float
8.1. API说明
- get_float(vtype, addr)
读取单精度浮点数(float)寄存器,返回有符号单精度浮点数
vtype:数据类型
addr:变量地址
set_float(vtype, addr,value)
设置单精度浮点数(float)寄存器
- vtype:数据类型
- addr:变量地址
- value: 1或0
8.2.LUA脚本
点击数值控件0x101C(LW 内存变量),触发on_update回调,读取内存变量0x101C,并设置内存变量0x101E
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x101C
then
set_float(vtype, addr+2, get_float(vtype, addr))
end
end
end
8.3.运行预览
运行虚拟屏,点击寄存器0x101C(LW 内存变量)数值,弹出键盘输入-1.23,寄存器0x1020(LW 内存变量)实时变化,如下所示:
9. get_double/set_double
9.1. API说明
- get_double(vtype, addr)
读取双精度浮点数(double)寄存器,返回双精度数据
vtype:数据类型
addr:变量地址
set_double(vtype, addr,value)
设置双精度浮点数(double)寄存器
- vtype:数据类型
- addr:变量地址
- value: 1或0
9.2.LUA脚本
点击数值控件0x1020(LW 内存变量),触发on_update回调,读取内存变量0x1020,并设置内存变量0x1024
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1020
then
set_double(vtype, addr+4, get_double(vtype, addr))
end
end
end
9.3.运行预览
运行虚拟屏,点击寄存器0x1020(LW 内存变量)数值,弹出键盘输入-12345.6789,寄存器0x1024(LW 内存变量)实时变化,如下所示:
10. get_string/set_string
10.1. API说明
- get_string(vtype, addr)
读取字符串变量
- vtype:数据类型
addr:变量地址
set_string(vtype, addr,value)
设置字符串类型寄存器
- vtype:数据类型
- addr:变量地址
- value:写入的字符串
10.2.LUA脚本
点击数值控件0x101C(LW 内存变量),触发on_update回调,读取内存变量0x101C,并设置内存变量0x1020
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1030
then
set_string(vtype, addr+16, get_string(vtype, addr))
end
end
end
10.3.运行预览
运行虚拟屏,点击寄存器0x1030(LW 内存变量)数值,弹出键盘输入"大彩abc123“,寄存器0x1040(LW 内存变量)实时变化,如下所示:
11. set_uint16_ex
11.1. API说明
批量设置短整型寄存器值
set_uint16_ex(vtype, addr, value1,value2, …, value120)
- vtype:数据类型
- addr:变量起始地址,最大可以写120个连续寄存器
- value1:寄存器1的值
- value2:寄存器2的值
- ……
- value120: 寄存器120的值
11.2.LUA脚本
点击数值控件0x1050(LW 内存变量),触发on_update回调,批量设置0x1060~0x1069(LW 内存寄变量)存器的值
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1050 and get_uint16(vtype, addr) % 2 == 0
then
set_uint16_ex(vtype, 0x1060,1,2,3,4,5,6,7,8,9,10)
end
end
end
11.3.运行预览
运行虚拟屏,点击寄存器0x1050(LW 内存变量)数值,批量设置0x1060~0x1069(LW 内存寄变量)的值依次为1~10,如下所示:
12. set_array
12.1. API说明
批量设置短整型寄存器值
set_array(vtype, addr, value1,value2, …, value120)
- vtype:数据类型
- addr:变量起始地址,最大可以写120个连续寄存器
- buff:word(字)数组,最大120个字
12.2.LUA脚本
点击数值控件0x1051(LW 内存变量),触发on_update回调,批量设置0x1060~0x1069(LW 内存寄变量)。
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1050 and get_uint16(vtype, addr) % 2 == 0
then
local ex_buff = {}
for i = 1, 10
do
ex_buff[i] = i*10
end
set_array(vtype, 0x1060, ex_buff)
end
end
end
12.3.运行预览
运行虚拟屏,点击寄存器0x1050(LW 内存变量)数值,批量设置0x1060~0x1069(LW 内存寄变量)值为依次为10,20,...,90,100